/**
 * @file
 * @brief RTD：XWDS：设备
 * @author
 * + 隐星魂 (Roy Sun) <xwos@xwos.tech>
 * @copyright
 * + Copyright © 2015 xwos.tech, All Rights Reserved.
 * > Licensed under the Apache License, Version 2.0 (the "License");
 * > you may not use this file except in compliance with the License.
 * > You may obtain a copy of the License at
 * >
 * >         http://www.apache.org/licenses/LICENSE-2.0
 * >
 * > Unless required by applicable law or agreed to in writing, software
 * > distributed under the License is distributed on an "AS IS" BASIS,
 * > WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * > See the License for the specific language governing permissions and
 * > limitations under the License.
 */

#include "../board/std.h"
#include <xwcd/ds/xwds.h>
#include "../RTD/xwds/device.h"

struct xwds mcalxwds;

void mcalxwds_init(void)
{
        xwds_init(&mcalxwds);
}

void mcalxwds_fini(void)
{
}

void mcalxwds_soc_init(void)
{
        xwer_t rc;

        xwds_soc_construct(&mcalxwds_soc);
        rc = xwds_device_probe(&mcalxwds,
                               xwds_cast(struct xwds_device *, &mcalxwds_soc),
                               NULL);
        XWOS_BUG_ON(rc < 0);
        rc = xwds_device_start(xwds_cast(struct xwds_device *, &mcalxwds_soc));
        XWOS_BUG_ON(rc < 0);
}
void mcalxwds_soc_fini(void)
{
        xwds_device_stop(xwds_cast(struct xwds_device *, &mcalxwds_soc));
        xwds_device_remove(xwds_cast(struct xwds_device *, &mcalxwds_soc));
        xwds_soc_destruct(&mcalxwds_soc);
}

void mcalxwds_uart_init(void)
{
        xwer_t rc;

        xwds_uartc_construct(&mcalxwds_uart2);
        rc = xwds_device_probe(&mcalxwds,
                               xwds_cast(struct xwds_device *, &mcalxwds_uart2),
                               NULL);
        XWOS_BUG_ON(rc < 0);
        rc = xwds_device_start(xwds_cast(struct xwds_device *, &mcalxwds_uart2));
        XWOS_BUG_ON(rc < 0);
}

void mcalxwds_uart_fini(void)
{
        xwds_device_stop(xwds_cast(struct xwds_device *, &mcalxwds_uart2));
        xwds_device_remove(xwds_cast(struct xwds_device *, &mcalxwds_uart2));
        xwds_uartc_destruct(&mcalxwds_uart2);
}

void mcalxwds_i2cm_init(void)
{
        xwer_t rc;

        xwds_i2cm_construct(&mcalxwds_lpi2c0m);
        rc = xwds_device_probe(&mcalxwds,
                               xwds_cast(struct xwds_device *, &mcalxwds_lpi2c0m),
                               NULL);
        XWOS_BUG_ON(rc < 0);
        rc = xwds_device_start(xwds_cast(struct xwds_device *, &mcalxwds_lpi2c0m));
        XWOS_BUG_ON(rc < 0);
}

void mcalxwds_i2cm_fini(void)
{
        xwds_device_stop(xwds_cast(struct xwds_device *, &mcalxwds_lpi2c0m));
        xwds_device_remove(xwds_cast(struct xwds_device *, &mcalxwds_lpi2c0m));
        xwds_i2cm_destruct(&mcalxwds_lpi2c0m);
}
